Contrast of Delay Multiply And Sum on FI data from an UFF file

by Ole Marius Hoel Rindal olemarius@olemarius.net

Last updated 07.08.2017

Contents

Setting up file path

To read data from a UFF file the first we need is, you guessed it, a UFF file. We check if it is on the current path and download it from the USTB websever.

close all;

% data location
url='http://ustb.no/datasets/';      % if not found downloaded from here
local_path = [ustb_path(),'/data/']; % location of example data

% Choose dataset
filename='Alpinion_L3-8_FI_hypoechoic.uff';

% check if the file is available in the local path or downloads otherwise
tools.download(filename, url, local_path);

Reading channel data from UFF file

channel_data=uff.read_object([local_path filename],'/channel_data');
% Check that the user have the correct version of the dataset
if(strcmp(channel_data.version{1},'1.0.2')~=1)
    error(['Wrong version of the dataset. Please delete ',local_path,...
                                        filename,' and rerun script.']);
end
UFF: reading channel_data [uff.channel_data]
UFF: reading sequence [uff.wave] [====================] 100%
%Print info about the dataset
channel_data.print_authorship
Name: 		 FI dataset of hypoechic cyst recorded on an  
		 Alpinion scanner with a L3-8 Probe from a CIRC  
		 General Purpose Ultrasound Phantom 
Reference: 	 www.ultrasoundtoolbox.com 
Author(s): 	 Ole Marius Hoel Rindal <olemarius@olemarius.net> 
		 Muyinatu Lediju Bell <mledijubell@jhu.edu> 
Version: 	 1.0.2 

Define Scan

Define the image coordinates we want to beamform in the scan object. Notice that we need to use quite a lot of samples in the z-direction. This is because the DMAS creates an "artificial" second harmonic signal, so we need high enough sampling frequency in the image to get a second harmonic signal.

z_axis=linspace(34e-3,48e-3,750).';
x_axis=zeros(channel_data.N_waves,1);
for n=1:channel_data.N_waves
    x_axis(n) = channel_data.sequence(n).source.x;
end

scan=uff.linear_scan('x_axis',x_axis,'z_axis',z_axis);

Set up the processing pipeline

pipe=pipeline();
pipe.channel_data=channel_data;
pipe.scan=scan;

pipe.transmit_apodization.window=uff.window.scanline;

pipe.receive_apodization.window=uff.window.none;
pipe.receive_apodization.f_number=1.7;

Define the DAS beamformer

das = midprocess.das();
%Sum only on transmit, so that we can do DMAS on receice
das.dimension = dimension.transmit();

Create the DMAS image using the delay_multiply_and_sum postprocess

dmas = postprocess.delay_multiply_and_sum();
dmas.dimension = dimension.receive;
dmas.channel_data = channel_data;
dmas.receive_apodization = pipe.receive_apodization;

b_data_dmas=pipe.go({das dmas});

% beamforming
b_data_dmas.plot(100,'DMAS');
USTB General beamformer MEX v1.1.2 .............done!
uff.apodization: Inputs and outputs are unchanged. Skipping process.

f_stop =

  single

    10779358

Beamform DAS image

Notice that I redefine the beamformer to use Hamming apodization and summing on both transmit and receive.

das.dimension = dimension.both();
das.receive_apodization.window=uff.window.hamming;
das.receive_apodization.f_number=1.7;

b_data_das=pipe.go({das});
b_data_das.plot([],'DAS');
uff.apodization: Inputs and outputs are unchanged. Skipping process.
USTB General beamformer MEX v1.1.2 .............done!

Plot both images in same plot

Plot both in same plot with connected axes, try to zoom!

f3 = figure(3);clf
set(f3,'Position',[200,200,600,350])
b_data_dmas.plot(subplot(2,3,[1 2]),'DMAS'); % Display image
ax(1) = gca;
b_data_das.plot(subplot(2,3,[4 5]),'DAS'); % Display image
ax(2) = gca;
linkaxes(ax);

Measure contrast

Lets measure the contrast using the "contrast ratio" as our metric.

% First we need to put our images in a different data struct that the
% measure contrast function expects
images.all{1} = b_data_dmas.get_image();
images.all{2} = b_data_das.get_image();

% Define the coordinates of the regions used to measure contrast
xc_nonecho = -9.5;      % Center of cyst in X
zc_nonecho = 40.8;      % Center of cyst in Z
r_nonecho = 2.8;        % Radi of the circle in the cyst
r_speckle_inner = 4.5;  % Radi of the inner circle defining speckle region
r_speckle_outer = 7;    % Radi of the outer circle defining speckle region

% Call the "tool" to measure the contrast
[CR] = tools.measure_contrast_ratio(b_data_das,images,xc_nonecho,...
                    zc_nonecho,r_nonecho,r_speckle_inner,r_speckle_outer);

% Plot the contrast as a bar graph together with the two images
figure(3);hold on
subplot(2,3,[3 6]);
bar(CR)
set(gca,'XTickLabel',{'DMAS','DAS'})
title('Measured Contrast');
ylabel('CR');